flv 文件格式详解 您所在的位置:网站首页 mac flv 格式 flv 文件格式详解

flv 文件格式详解

#flv 文件格式详解| 来源: 网络整理| 查看: 265

flv容器的扩展名是.flv 是邮adobe推出的一种封装格式,主要用于流媒体系统,由于flash player的普遍使用,flv的容器也比较流行。 flv的封装格式比较简单,由一个header和body构成。 其官方文档地址为: http://read.pudn.com/downloads358/doc/fileformat/1556492/adobe_video_file_format_spec_v10.pdf

FLV Header

FLV header字段说明如图: 内容 类型 说明 Signature uint_8 “F” 0x46 Signature uint_8 “L” 0x4C Signature uint_8 “V” 0x56 Version uint_8 0x01 TypeFlagsReserved UB[5] 0 TypeFlagsAudio UB[1] 标记是否有音频1代表有 TypeFlagsReserved UB[1] TypeFlagsVideo UB[1] 标记是否有视频1代表有 DataOffset uint_32 header大小

图表中表示的是flv header的各字段。这个是header是固定的,总共的大小为9个字节,所以DATAOFFSET基本为9 在这里插入图片描述 如图:这就是flv header 左边就是16进制数据。

FLV body

FLV body有PreviousTagSize 和 tag 两部分组成。 PreviousTagSize 代表的是上一个tag的大小, PreviousTagSize 为0 tag 具体的音视频数据

内容 类型 说明 PreviousTagSize 0 uint_32 0 tag1 FLVTAG tag PreviousTagSize1 uint_32 上一个tag大小 … … … tagN FLVTAG tag PreviousTagSizeN uint_32 上一个tag大小

PreviousTagSize

就是上一个tag的大小, 第一个PreviousTagSize 总是0,因为上一个tag没有是,紧临着FLV header。大小是4个字节。

tag

tag由 header和data 两部分构成。

tag header

内容 类型 说明

tagtype uint_8 tag类型 0x08代表音频 0x09 代表视频 0x12 代表脚本 datasize uint_24 代表tag data的大小 timestamp uint_24 时间戳 毫秒 timestampExtended uint_8 额外时间戳 streamID uint_24 0

一个tag header的大小为12个字节。

tag data

tag data有不同的类型,而不同的类型结构也是不一样的。 audio tag 内容 类型 说明

soundformat UB[4] 音频格式 0 = Linear PCM, platform endian 1 = ADPCM 2 = MP3 3 = Linear PCM, little endian 4 = Nellymoser 16-kHz mono 5 = Nellymoser 8-kHz mono 6 = Nellymoser 7 = G.711 A-law logarithmic PCM 8 = G.711 mu-law logarithmic PCM 9 = reserved 10 = AAC 11 = Speex 14 = MP3 8-Khz 15 = Device-specific sound soundrate UB[2] 音频采样率 0 = 5.5-kHz 1 = 11-kHz 2 = 22-kHz 3 = 44-kHz(AAC一直是3) soundsize UB[1] 音频位深 0 = snd8Bit 1 = snd16Bit soundType UB[1] 音频声道 0 = sndMono(单声道) 1 = sndStereo(立体声) soundData uint_8 音频编码数据

由图表可知,audio tag描述总共占用一个字节,剩余就是音频的编码数据 ,而音频的编码数据的存储方式也是有区别,这里就不详细说明了。 video tag 内容 类型 说明

frameType UB[4] 1: keyframe (for AVC, a seekable frame)关键帧 2: inter frame (for AVC, a non-seekable frame)非关键帧 3: disposable inter frame (H.263 only) 4: generated keyframe (reserved for server use only) 5: video info/command frame codecId UB[4] 1: JPEG (currently unused) 2: Sorenson H.263 3: Screen video 4: On2 VP6 5: On2 VP6 with alpha channel 6: Screen video version 2 7: AVC videoData If CodecID == 2 H263VIDEOPACKET If CodecID == 3 SCREENVIDEOPACKET If CodecID == 4 VP6FLVVIDEOPACKET If CodecID == 5 VP6FLVALPHAVIDEOPACKET If CodecID == 6 SCREENV2VIDEOPACKET if CodecID == 7 AVCVIDEOPACKET

若是AVC 即264的数据 内容 类型 说明

AVCPacketType uint_8 0: AVC sequence header 1: AVC NALU 2: AVC end of sequence (lower level NALU sequence ender is not required or supported) CompositionTime int_24 if AVCPacketType == 1 Composition time offset else 0 Data uint_8[n] if AVCPacketType == 0 AVCDecoderConfigurationRecord else if AVCPacketType == 1 One or more NALUs (can be individualslices per FLV packets; that is, full framesare not strictly required) else if AVCPacketType == 2 empty

script tag 脚本tag 主要是在FLVheader和body之间的那个onMetaData, 里面存储都整个flv的信息,也可以包含各个tag的偏移量。这并不是一个必要的tag,没有该tag也可以进行播放。这个tag就不详细叙述了。该tag可以通过工具yamdi进行生成,该工具就是对flv进行流化处理。yamdi的地址为 https://github.com/ioppermann/yamdi https://sourceforge.net/projects/yamdi/files/

相关工具 播放工具

vlc,ffplay, video.js,ijkplayer等

测试工具

flvAnalyser: https://github.com/zymill/flvAnalyser flvparser : https://download.csdn.net/download/cabbage2008/9343003 FLV Format Analysis https://sourceforge.net/projects/flvformatanalysis/

开发工具

rtmpdump http://rtmpdump.mplayerhq.hu/ flvparser https://github.com/riverlight/FlvParser yamadi https://github.com/ioppermann/yamdi ffmpeg http://ffmpeg.org/

图形详解

在这里插入图片描述相同的颜色, 相同的级别 在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有